使用 NodeJS 的时候, 使用官方给的 npm 进行包管理, 后来出现 yarn 进行并行处理, nrm 进行 repo 源管理.
就 golang 来讲, 官方提供 dep 来管理依赖, 还有 glide 也相对不错.
自从 2020 年以来, Go Mod 模式越来越成熟, 原来的 dep, glide 已经渐渐退出历史舞台, 大家统一使用 go mod 进行包管理.
Go 1.11 Modules
golang 1.11+ 版本, 开启 GO111MODULE=on
环境变量.
go mod [command]
- init 初始化一个新的 Go 项目
- tidy 拉取缺少的模块, 移除无用模块
- download 下载依赖到 cache 目录
- graph 输出依赖树
- vendor 将依赖转换成本目录的 vendor 模式
- verify 验证依赖是否正确
- why 解释为什么需要依赖
清理缓存依赖: go clean -modcache
文件夹内会有 go.mod
和 go.sum
文件, 依赖文件存储在 $GOPATH/pkg/mod/{cache,...}
文件夹下.
文档 https://juejin.im/post/5c8e503a6fb9a070d878184a
dep
文档 https://godoc.org/github.com/golang/dep
可用命令
dep [command]
- init 初始化一个新的 Go 项目, 或者集成已有项目
- status 查看当前项目依赖树
- ensure 安装依赖
- prune 现在在执行 ensure 后自动执行 prune
- version 查看当前版本
初始化后, 会生成 Gopkg.lock
和 Gopkg.toml
文件, 还有 vendor
文件夹.
glide
文档 https://github.com/Masterminds/glide
可用命令
glide [command]
- init 初始化一个新的 Go 项目, 或者集成已有项目
- get github.com/xx/yy 下载包并且纳入 glide.yaml
- install 根据 glide.yaml 配置下载依赖
- import 从其他版本管理中迁移到 glide.yaml 中
- update 更新依赖到新版本
- –version 查看当前版本
初始化后, 会生成 glide.lock
和 glide.yaml
文件,
还有 vender
文件夹.
错误管理
关于出现 golang_org ... malformed module path ... missing dot in first path element
错误的问题
例如在执行 go mod vender/why
等的时候, 会报错类似下面:
1 | wss imports |
主要原因是在 net
, crypto
等内置模块中, 引入了 golang_org/x/net/...
这样的路径, 造成无法找到依赖模块.
找了很久问题, 终于在 $GOROOT
下找到了内置 net 模块代码, 其中确实引用的地址是 golang_org/x/net/...
, 但是依赖路径 $GOPATH/pkg/mod/
下却只有 golang.org/x/net/...
模块,在 $GOROOT/src/vender
目录下终于找到 golang_org
字样
后来我发现, 我的 golang 版本为 1.13.4
也是最新的版本. 但是按照方法为 brew install go
安装的 1.11.x
, 后期又使用 brew upgrade go
进行更新到当前最新版本的. 于是打算卸载 brew 方式安装的 go 而采用 官方提供的 pkg 方式重新安装.
1 | brew uninstall go --ignore-dependencies |
--ignore-dependencies
表示忽略依赖, 比如原来有 dep, glide 的要依赖于 go 那么不加这个参数会不让卸载.
使用官方推荐的方式安装, 下载 pkg 安装包, 直接下一步就可以安装完成.
重新进入 $GOROOT/src/vender
目录, 发现依赖文件夹 golang.org
, 已经改过来了.
至此, 重新执行 go mod vender/why
无报错.
原因: 使用 brew install go
安装的 golang 有问题.